home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue41 / ComCorn / LVItems.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-12-03  |  2.8 KB  |  121 lines

  1. unit LVItems;
  2.  
  3. interface
  4.  
  5. uses
  6.   ComObj, Windows, ActiveX, ComCtrls, LVCtrl_TLB;
  7.  
  8. type
  9.   TListItems = class(TAutoIntfObject, IListItems, IEnumVARIANT)
  10.   private
  11.     FListItems: ComCtrls.TListItems;
  12.     FEnumPos: Integer;
  13.   protected
  14.     { IListItems methods }
  15.     function Add: IListItem; safecall;
  16.     function Get_Count: Integer; safecall;
  17.     function Get_Item(Index: Integer): IListItem; safecall;
  18.     procedure Remove(Index: Integer); safecall;
  19.     function Get__NewEnum: IUnknown; safecall;
  20.     { IEnumVariant methods }
  21.     function Next(celt: Longint; out elt;  pceltFetched: PLongint): HResult;
  22.       stdcall;
  23.     function Skip(celt: Longint): HResult; stdcall;
  24.     function Reset: HResult; stdcall;
  25.     function Clone(out Enum: IEnumVariant): HResult; stdcall;
  26.   public
  27.     constructor Create(AOwner: ComCtrls.TListItems);
  28.   end;
  29.  
  30. implementation
  31.  
  32. uses ComServ, LVItem;
  33.  
  34. { TListItems }
  35.  
  36. constructor TListItems.Create(AOwner: ComCtrls.TListItems);
  37. begin
  38.   inherited Create(ComServer.TypeLib, IListItems);
  39.   FListItems := AOwner;
  40. end;
  41.  
  42. { TListItems.IListItems }
  43.  
  44. function TListItems.Add: IListItem;
  45. begin
  46.   Result := LVItem.TListItem.Create(FListItems.Add);
  47. end;
  48.  
  49. function TListItems.Get__NewEnum: IUnknown;
  50. begin
  51.   Result := Self;
  52. end;
  53.  
  54. function TListItems.Get_Count: Integer;
  55. begin
  56.   Result := FListItems.Count;
  57. end;
  58.  
  59. function TListItems.Get_Item(Index: Integer): IListItem;
  60. begin
  61.   Result := LVItem.TListItem.Create(FListItems[Index]);
  62. end;
  63.  
  64. procedure TListItems.Remove(Index: Integer);
  65. begin
  66.   FListItems.Delete(Index);
  67. end;
  68.  
  69. { TListItems.IEnumVariant }
  70.  
  71. function TListItems.Clone(out Enum: IEnumVariant): HResult;
  72. begin
  73.   Enum := nil;
  74.   Result := S_OK;
  75.   try
  76.     Enum := TListItems.Create(FListItems);
  77.   except
  78.     Result := E_OUTOFMEMORY;
  79.   end;
  80. end;
  81.  
  82. function TListItems.Next(celt: Integer; out elt; pceltFetched: PLongint): HResult;
  83. var
  84.   V: OleVariant;
  85.   I: Integer;
  86. begin
  87.   Result := S_FALSE;
  88.   try
  89.     if pceltFetched <> nil then pceltFetched^ := 0;
  90.     for I := 0 to celt - 1 do
  91.     begin
  92.       if FEnumPos >= FListItems.Count then Exit;
  93.       V := Get_Item(FEnumPos);
  94.       TVariantArgList(elt)[I] := TVariantArg(V);
  95.       // trick to prevent variant from being garbage collected, since it needs
  96.       // to stay alive because it is party of the elt array
  97.       TVarData(V).VType := varEmpty;
  98.       TVarData(V).VInteger := 0;
  99.       Inc(FEnumPos);
  100.       if pceltFetched <> nil then Inc(pceltFetched^);
  101.     end;
  102.   except
  103.   end;
  104.   if (pceltFetched = nil) or ((pceltFetched <> nil) and (pceltFetched^ = celt)) then
  105.     Result := S_OK;
  106. end;
  107.  
  108. function TListItems.Reset: HResult;
  109. begin
  110.   FEnumPos := 0;
  111.   Result := S_OK;
  112. end;
  113.  
  114. function TListItems.Skip(celt: Integer): HResult;
  115. begin
  116.   Inc(FEnumPos, celt);
  117.   Result := S_OK;
  118. end;
  119.  
  120. end.
  121.